// 1. 将token存储在vuex中  vuex刷新数据会回到原始值,利用js-cookie
// 2.调用接口 存储
// 3.将调用成功的提示 直接在仓库中一起显示
// 调用 用户信息的接口并存储到仓库中
import { getToken, setToken } from '../../utils/auth'
import { sysLogin } from '../../api/login'
import { sysProfile, sysUser } from '../../api/user'
import { Message } from 'element-ui'

// 路由中导出了路由实例
import { constantRoutes, resetRouter } from '@/router'
// 导入需要权限管理的路由与router
import asyncRoutes from '@/router/modules/index'
import Router from '@/router'
const state = {
  token: getToken() || '',
  userInfo: ''
}
const mutations = {
  setToken(state, value) {
    state.token = value
    setToken(value)
  },
  setUserInfo(state, value) {
    state.userInfo = value
  },
  logOut(state) {
    // 清空token 以及清除用户信息
    // 触发mutations中的方法,重置为空
    // 此时的this==>this.$store(在其他模块使用mutations)
    this.commit('user/setUserInfo', '')
    this.commit('user/setToken', '')
    // 每次退出登录都需要调用此方法 所以直接在这里进行路由的重置 调用router/index.js中暴露的方法.进行重置
    resetRouter()
  }
}
const getters = {}
const actions = {
  async toLogin(store, val) {
    const res = await sysLogin(val)
    Message.success(res.message)
    store.commit('setToken', res.data)
  },
  // 获取用户信息
  async getUserInfo({ commit }) {
    // 获取信息
    const res = await sysProfile()
    console.log(res, '获取用户信息')
    // 获取员工基本信息,头像等
    const res2 = await sysUser(res.data.userId)
    console.log(res2, '获取头像等其他信息')
    // 把获取的两个对象 解构后合并
    // 方式一:{...res,...res2} 方式二:Object.assign(目标对象,其他对象)
    commit('setUserInfo', Object.assign({}, res.data, res2.data))

    // 匹配当前用户能访问的路由,通过addRoutes添加 根据权限标识匹配
    const newArr = asyncRoutes.filter((item) => {
      return res.data.roles.menus.includes(item.meta.name)
    })
    // 动态添加到路由中 还有重定向404页面的路由
    // addRoutes刚添加的路由配置,需要再经过一次导航守卫 才可以正常使用 修改导航守卫设置
    Router.addRoutes([...newArr, { path: '*', redirect: '/404', hidden: true }])
    // 拿到完整的路由信息 [静态路由,匹配到的动态路由,重定向到404的路由]
    const allRoutes = [
      ...constantRoutes,
      ...newArr,
      { path: '*', redirect: '/404', hidden: true }
    ]
    // 调用其他模块的mutations方法 通过修改vuex中的路由信息,进行同步
    // commit('模块名/方法名', 实参, { root: true })
    commit('routes/setRoutesList', allRoutes, { root: true })
  }
}

export default {
  namespaced: true, // 开启命名空间
  state,
  mutations,
  getters,
  actions
}
